home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 2
/
United Public Domain Gold 2.iso
/
utilities
/
pu295.dms
/
pu295.adf
/
Logging
/
VhfLog
/
VHFLOG.BAS
< prev
next >
Wrap
BASIC Source File
|
1988-12-18
|
10KB
|
301 lines
' VHFLOG.BAS version 1.3
' Copyright (© 1986,1987 by Clarke Greene K1JX) NOT FOR COMMERCIAL USE
' Amiga Version by John Gager-K7KB
'
' This Microsoft (tm) BASIC program will build a complete log package
' for any of the ARRL VHF Contests.
'
' The file containing the log entries must be an ASCII file in the
' following format:
' (Each band requires a separate log entry file)
'
' TIME CALLSIGN RCV'D GRID SQUARE
' (each LOG entry must be followed by a carriage RETURN)
'
' At least one space must be between each field of each log entry. Only
' a changed digit in the time field must be present; FOR example, IF the
' contest begins at 1800Z AND the first contact is made at 1802Z AND the
' second contact is made at 1805Z, THEN only 5 need be entered in the
' TIME field. IF the third contact is made at 1812 Z, THEN 12 should be
' entered in the TIME field. IF the NEXT contact is made at 1812Z, THEN
' no number need be entered in the TIME FIELD (however, be sure TO enter
' a space TO indicate separation between fields)!
'
' These files will be produced:
'
' <filename>.LOG - this is a complete log ready for printing
' <filename>.DUP - this is a sorted duplicate listing ready for printing
' <filename>.SUM - this is a summary sheet ready for printing
'
'
' Depending on the version of BASIC for your particular machine, the CLS
' (CLEAR SCREEN) command must be changed. Consult your own computer's
' BASIC documentation FOR more information.
'
'
' If compiling (a VERY good idea for several orders of magnitude
' improvement in speed), use O AND E switches.
'
' Define arrays and variables
'
CLEAR ,42000&:DEFINT a-Z : OPTION BASE 1
DIM ENTRY$(1500), GRID$(1500), MULT$(250), Q(250), MONTH$(12)
BLANK$=" " : BL$="" : TRUE=-1
FOR X=1 TO 12:READ MONTH$(X):NEXT
DATA Jan.,Feb.,Mar.,Apr.,May.,June,July,Aug.,Sept.,Oct.,Nov.,Dec.
DUPE$="- Duplicate QSO -" : DIFGRID$="Station in new Grid" : NEWGRID$=" - Mult. #"
' Define format strings for printouts
LOGFORM$=" \ \ \ \ \ \ \ \ \ \ \ \"
DUPFORM$=" \ \ \ \ \ \ \ \ \ \"
SUMFORM$=" \ \ \ \ \ \ \ \ \ \"
'
' Get information from user
'
CLS
COLOR 3:PRINT TAB(27) " VHF Contest Log Processor " : PRINT : PRINT
COLOR 1:PRINT : PRINT TAB(5) "What is the station callsign? ";
INPUT "", MYCALL$ : MYCALL$=UCASE$(MYCALL$)
EnterGrid:
PRINT : PRINT TAB(5) "What Grid Square is the station in? ";
INPUT "", MYGRID$ : MYGRID$=UCASE$(MYGRID$)
IF LEN(MYGRID$)<>4 THEN PRINT CHR$(7);: GOTO EnterGrid
EnterDate:
PRINT : PRINT TAB(5) "What is the beginning date of the contest";
COLOR 3 : PRINT" <DD/MM/YY> ";
COLOR 1 : INPUT "", STARTDATE$
MARK=INSTR(STARTDATE$,"/") : IF MARK=0 THEN MARK=INSTR(STARTDATE$,"-")
STARTDAY=VAL(LEFT$(STARTDATE$,MARK-1))
STARTDATE$=RIGHT$(STARTDATE$,LEN(STARTDATE$)-MARK)
MARK=INSTR(STARTDATE$,"/") : IF MARK=0 THEN MARK=INSTR(STARTDATE$,"-")
MON$=MONTH$(VAL(LEFT$(STARTDATE$,MARK-1)))
YR$=RIGHT$(STARTDATE$,LEN(STARTDATE$)-MARK)
PRINT : PRINT TAB(5) "What is the GMT starting time for the contest? ";
INPUT "", STARTGMT$
GetLog:
PRINT : PRINT TAB(5) "What file is the log extract located in? ";
INPUT "", INFILE$
GOSUB CheckFile ' check to see if file exists
IF INSTR(INFILE$,".")<>0 THEN OUTFILE$=LEFT$(INFILE$,INSTR(INFILE$,".")-1) ELSE OUTFILE$=INFILE$
PRINT : PRINT TAB(5) "What frequency band is the log extract for? ";
INPUT "", BAND$
'
' Collect log extract from input file and assign data to arrays
'
FOR I=1 TO 250
MULT$(I)=BL$
Q(I)=1
NEXT
CLS
PRINT : PRINT TAB(5) "Duping and counting...";
'
' Initialize variables
'
RAWTOTAL=0 : QSOS=0 : DUPES=0 : MULTNR=0 ' initialize counters
DAY=STARTDAY : PREVIOUSGMT$=STARTGMT$ ' (re)set starting time and day
'
' Open input data file and output .LOG file
'
OPEN INFILE$ FOR INPUT AS #1 LEN=5000
OPEN OUTFILE$+".LOG" FOR OUTPUT AS #2 LEN=5000
'
' Input data, process, and enter into output file
'
WHILE NOT EOF(1)
LINE INPUT #1, THISENTRY$ ' read entire line from disc file
WHILE ASC(RIGHT$(THISENTRY$,1))<48 AND LEN(THISENTRY$)>0
THISENTRY$=LEFT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off trailing spaces,etc
WEND
IF LEN(THISENTRY$)>0 THEN RAWTOTAL=RAWTOTAL+1 ELSE GOTO SkipEntry
'
' Separate grid from THISENTRY$
'
THISGRID$=RIGHT$(THISENTRY$,4)
THISGRID$=UCASE$(THISGRID$)
THISENTRY$=LEFT$(THISENTRY$,LEN(THISENTRY$)-4)
WHILE ASC(RIGHT$(THISENTRY$,1))<48
THISENTRY$=LEFT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off trailing spaces
WEND
'
' Separate GMT from THISENTRY$
'
WHILE ASC(LEFT$(THISENTRY$,1))<48
THISENTRY$=RIGHT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off leading spaces
WEND
IF INSTR(THISENTRY$,BLANK$)<>0 THEN GMT$=LEFT$(THISENTRY$,INSTR(THISENTRY$,BLANK$)-1) ELSE GMT$=BL$
THISENTRY$=RIGHT$(THISENTRY$,(LEN(THISENTRY$)-LEN(GMT$)))
WHILE LEFT$(THISENTRY$,1)=BLANK$
THISENTRY$=RIGHT$(THISENTRY$,LEN(THISENTRY$)-1) ' strip off leading spaces
WEND
THISENTRY$=UCASE$(THISENTRY$)
'
' Fill in missing time data
'
GMT$=LEFT$(PREVIOUSGMT$,(4-LEN(GMT$)))+GMT$
THEDATE$=BL$ : IF GMT$<PREVIOUSGMT$ THEN DAY=DAY+1 : THEDATE$=STR$(DAY)+BLANK$+MON$
'
' Check for dupes
'
DUPE.QSO=NOT TRUE : NOTE$=BL$ ' clear note field
FOR I=1 TO QSOS
IF THISENTRY$=ENTRY$(I) AND THISGRID$<>GRID$(I) THEN NOTE$=DIFGRID$
IF THISENTRY$=ENTRY$(I) AND THISGRID$=GRID$(I) THEN NOTE$=DUPE$ : DUPES=DUPES+1 : DUPE.QSO=TRUE : I=QSOS
NEXT
IF DUPE.QSO GOTO WriteEntry ' if contact is a dupe, skip over multiplier search
QSOS=QSOS+1 : ENTRY$(QSOS)=THISENTRY$ : GRID$(QSOS)=THISGRID$
'
' Check for multipliers
'
NEWMULT=TRUE ' initially set multiplier flag true
FOR I=1 TO MULTNR
IF MULT$(I)=THISGRID$ THEN Q(I)=Q(I)+1 : NEWMULT=NOT TRUE : J=MULTNR
NEXT
IF NEWMULT THEN MULTNR=MULTNR+1 : MULT$(MULTNR)=THISGRID$ : NOTE$=THISGRID$+NEWGRID$+STR$(MULTNR)
'
' Write entry to file
'
WriteEntry:
IF (RAWTOTAL-1) MOD 50=0 THEN GOSUB PrintHeader ' print the header if this is the beginning of a page
PRINT #2, USING LOGFORM$; THEDATE$; GMT$; THISENTRY$; MYGRID$; THISGRID$; NOTE$
IF RAWTOTAL MOD 50=0 THEN PRINT #2, CHR$(12) ' print a form feed if this is the end of the page
'
' Update variables for next entry
'
PREVIOUSGMT$=GMT$ : GMT$=BL$
SkipEntry:
WEND
IF RAWTOTAL MOD 50 <>0 THEN PRINT #2, CHR$(12) ' if a form feed wasn't printed, print one now
CLOSE
COLOR 3 : PRINT "Done" : COLOR 1
'
' Build dupe sheet
'
PRINT : PRINT TAB(5) "Preparing dupe sheet...";
'
' Sort callsigns for dupe sheet
'
M=QSOS\2
WHILE M>0
FOR I=M+1 TO QSOS
J=I-M
WHILE J>0
IF ENTRY$(J)>ENTRY$(J+M) THEN SWAP ENTRY$(J),ENTRY$(J+M) : J=J-M ELSE J=0
WEND
NEXT
M=M\2
WEND
'
' Enter dupe sheet into file
'
OPEN OUTFILE$+".DUP" FOR OUTPUT AS #1
IF QSOS MOD 250=0 THEN LASTPAGE=QSOS\250 ELSE LASTPAGE=QSOS\250+1
FOR PAGE=1 TO LASTPAGE
PRINT #1, SPC(20-(LEN(MYCALL$)+LEN(BAND$))/2); MYCALL$; " -- Dupe Sheet for "; BAND$; " MHz Band -- Page"; STR$(PAGE)
PRINT #1, BL$ : PRINT #1, BL$
FOR ROW=1 TO 50
E=(PAGE-1)*250+ROW
PRINT #1, USING DUPFORM$; ENTRY$(E); ENTRY$(E+50); ENTRY$(E+100); ENTRY$(E+150); ENTRY$(E+200)
NEXT
PRINT #1, CHR$(12) ' go to next page
NEXT
CLOSE
COLOR 3 : PRINT "Done" : COLOR 1
'
' Build summary listing
'
PRINT : PRINT TAB(5) "Preparing summary sheet...";
'
' Sort multipliers for summary sheet
'
M=MULTNR\2
WHILE M>0
FOR I=M+1 TO MULTNR
J=I-M
WHILE J>0
IF MULT$(J)>MULT$(J+M) THEN SWAP MULT$(J),MULT$(J+M) : SWAP Q(J),Q(J+M) : J=J-M ELSE J=0
WEND
NEXT
M=M\2
WEND
'
' Append QSO per grid number to Grid Square
'
FOR I=1 TO MULTNR
MULT$(I)=MULT$(I)+" - "+STR$(Q(I))
NEXT
'
' Enter summary sheet into file
'
OPEN OUTFILE$+".SUM" FOR OUTPUT AS #1
PRINT #1, SPC(12-(LEN(MYCALL$)+LEN(BAND$)+LEN(MON$))/2); MYCALL$; " -- Summary Sheet for "; BAND$;
PRINT #1, " MHz Band - "; MON$; " "; YR$; " VHF Contest"
PRINT #1, BL$
PRINT #1, TAB(13); "Grid Square Listing and number of contacts per Grid"
PRINT #1, BL$ : PRINT #1, BL$
IF MULTNR MOD 5=0 THEN LASTROW=MULTNR\5 ELSE LASTROW=MULTNR\5+1
FOR ROW=1 TO LASTROW
PRINT #1, USING SUMFORM$; MULT$(ROW); MULT$(ROW+LASTROW); MULT$(ROW+LASTROW*2); MULT$(ROW+LASTROW*3); MULT$(ROW+LASTROW*4)
NEXT
PRINT #1, BL$ : PRINT #1, BL$ : PRINT #1, BL$
PRINT #1, TAB(18); "Total Valid QSOs - "; STR$(QSOS); TAB(45); "Dupes - "; STR$(DUPES)
PRINT #1, TAB(18); "Grid Squares - "; STR$(MULTNR)
PRINT #1, CHR$(12)
CLOSE
COLOR 3 : PRINT "Done" : COLOR 1
'
' Print results
'
CLS : PRINT CHR$(7)
PRINT : PRINT TAB(5) "Results for the "; BAND$; " MHz band"
PRINT : PRINT TAB (8) "Valid QSOs:";:COLOR 3:PRINT USING " ####";QSOS
COLOR 1 : PRINT TAB(8) "Duplicate QSOs:"; : COLOR 3 : PRINT USING " ###"; DUPES
COLOR 1 : PRINT TAB(8) "Grid Squares:"; : COLOR 3 : PRINT USING " ###"; MULTNR
COLOR 1 : PRINT : PRINT : PRINT
PRINT TAB(5) "Type ";:COLOR 3:PRINT"C";:COLOR 1
PRINT" to continue with another band,"
PRINT TAB(5) "or any other key to Exit ";
InkeyLoop:
I$=INKEY$:IF I$="" THEN GOTO InkeyLoop
IF UCASE$(I$)="C" THEN CLS : GOTO GetLog ELSE CLS : END
'
' Subroutine to trap missing file
'
CheckFile:
ON ERROR GOTO FileNotFound
OPEN INFILE$ FOR INPUT AS #1 ' try opening file
ON ERROR GOTO 0
CLOSE
RETURN
'
' Error trap for missing file
'
FileNotFound:
PRINT CHR$(7) : PRINT TAB(4) "That file does not exist - type X to Exit or any other key to continue ";
ANS$=INPUT$(1) : IF ANS$="X" OR ANS$="x" THEN CLS : END
PRINT
RESUME GetLog
'
' Subroutine to print log sheet header
'
PrintHeader:
PRINT #2, BL$
PRINT #2, TAB(5); MYCALL$; " "; BAND$; " MHz Log"; TAB(70); "Page"; STR$(RAWTOTAL\50+1)
PRINT #2, BL$
PRINT #2, " Date Time Callsign Sent Rcvd Notes"
PRINT #2, " "; STRING$(74,61)
THEDATE$=STR$(DAY)+BLANK$+MON$
RETURN